enum CacheType {
  Local,
  Session
}

class Cache {
  storage: Storage

  constructor(type: CacheType) {
    this.storage = type === CacheType.Local ? localStorage : sessionStorage
  }

  setCache(key: string, value: any) {
    // 这里设置value != undefined的原因是让storage.setItem可以存储boolean类型false，
    // 如果设置if(value)的话boolean类型false也存不了
    // undefined == undefined ----------- true
    // null == undefined      ----------- true
    // false == undefined     ----------- true

    // 存储的时候先把对象通过JSON.stringify转为json字符串，取出的时候通过JSON.parse把json字符串转换为对象
    // 不转换的话，storage.setItem存储对象例如{a:1,b:2}的时候会存储为[object Object]

    if (value != undefined) {
      this.storage.setItem(key, JSON.stringify(value))
    }
  }

  getCache(key: string) {
    const value = this.storage.getItem(key)
    if (value != undefined) {
      return JSON.parse(value)
    }
  }

  removeCache(key: string) {
    this.storage.removeItem(key)
  }

  clear() {
    this.storage.clear()
  }
}

const localCache = new Cache(CacheType.Local)
const sessionCache = new Cache(CacheType.Session)

export { localCache, sessionCache }
